package studia.figlewicz.math.library;

import java.util.Date;
import java.util.Set;

public class _test_opcja_amerykanska_model_black_scholes {
	

	
	public static void main(String[] args) {
		
		
		Date rozpoczecie = new Date(101,0,2);
		Date wygasniecie = new Date(103,0,1);
		Double nominal = new Double(1);
		Double cenaWykonania = new Double(100);
		int krokCzasowy = 1;
		
		PrzeplywPieniezny opcjaCall = new PrzeplywOpcyjnyAmerykanski(wygasniecie,cenaWykonania,TypOpcji.CALL,nominal,krokCzasowy,rozpoczecie);
		
		
/////////////////////////////////////////////////////
		// projekcje
/////////////////////////////////////////////////////
		// zarzadca projekcji
		Date poczatekSymulacji = new Date(101,0,1);
		Set<Date> datySymulacji = ((PrzeplywOpcyjnyAmerykanski)opcjaCall).getDatyWykonania();
		
		ZarzadcaProjekcji zarzadcaProjekcji = new ZarzadcaProjekcji();
		
		// modele
		Model blackScholes = new ModelBlackScholes(MetodaInterpolacji.LINIOWA);
		zarzadcaProjekcji.dodajModel(blackScholes);
		
		Konwencja konwencjaShortRate = Utils.getStandardKonwencja();
		Konwencja konwencjaIRS = Utils.getStandardKonwencja();
		
		Date dataNotowania = new Date(101,0,1);
		KontraktNaStopeProcentowa short1D = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(1,0,0,0),dataNotowania,99.99,konwencjaShortRate);
		KontraktNaStopeProcentowa short2D = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(2,0,0,0),dataNotowania,99.98,konwencjaShortRate);
		KontraktNaStopeProcentowa short1W = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,1,0,0),dataNotowania,99.90,konwencjaShortRate);
		KontraktNaStopeProcentowa short1M = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,1,0),dataNotowania,99.55,konwencjaShortRate);
		KontraktNaStopeProcentowa short3M = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,3,0),dataNotowania,98.15,konwencjaShortRate);
		KontraktNaStopeProcentowa short6M = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,6,0),dataNotowania,97,konwencjaShortRate);
		KontraktNaStopeProcentowa IRS1Y = new NotowanieIRS(new Termin(0,0,0,0), new Termin(0,0,0,1),dataNotowania,6.15,konwencjaIRS);
		KontraktNaStopeProcentowa IRS2Y = new NotowanieIRS(new Termin(0,0,0,0), new Termin(0,0,0,2),dataNotowania,6.20,konwencjaIRS);
		KrzywaStopyProcentowej krzywa = new KrzywaStopyProcentowej();
		krzywa.dodajKontrakt(short1D);
		krzywa.dodajKontrakt(short2D);
		krzywa.dodajKontrakt(short1W);
		krzywa.dodajKontrakt(short1M);
		krzywa.dodajKontrakt(short3M);
		krzywa.dodajKontrakt(short6M);
		krzywa.dodajKontrakt(IRS1Y);
		krzywa.dodajKontrakt(IRS2Y);
		
		
		ZmiennaObjasniajaca krzywaTerminowa = krzywa;
		ZmiennaObjasniajaca zmiennosc = new Stala(0.2);
		ZmiennaObjasniajaca zmiennaLosowa = new ZmiennaLosowa(RozkladZmiennejLosowej.NORMALNY,0,1);
		IndexSpot cenaInstrumentuPodstawowego = new IndexSpot();
		Konwencja konwencjaSpot = Utils.getStandardKonwencja();
		cenaInstrumentuPodstawowego.addNotowanie(new NotowanieSpot(dataNotowania,96,konwencjaSpot));
		ZmiennaObjasniajaca cenaPoczatkowa = cenaInstrumentuPodstawowego;
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_STOPA_PROCENTOWA,krzywaTerminowa);
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_ZMIENNOSC,zmiennosc);
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_CENA_POCZATKOWA,cenaPoczatkowa);
		blackScholes.setZmiennaObjasniajaca(ModelBlackScholes.ZMIENNA_OBJASNIAJACA_ZMIENNA_LOSOWA,zmiennaLosowa);
		
		// wykonanie projekcji
		zarzadcaProjekcji.wykonajProjekcjeMonteCarlo(datySymulacji, poczatekSymulacji, 100);
		
/////////////////////////////////////////////////////
		// wycena
/////////////////////////////////////////////////////
		
		
		// zarzadca wyceny
		ZarzadcaWyceny zarzadcaWyceny = new ZarzadcaWyceny();
		zarzadcaWyceny.dodajPrzeplyw(opcjaCall);

		ZmiennaRynkowa procesCenyBS = new ZmiennaRynkowa(blackScholes,ModelBlackScholes.ZMIENNA_OBJASNIANA_BLACK_SCHOLES_PROCESS);
		
		opcjaCall.setZmienneRynkowe(PrzeplywOpcyjnyAmerykanski.CENA_INSTRUMENTU_PODSTAWOWEGO, procesCenyBS);
		
		zarzadcaWyceny.setDyskonto(krzywa,poczatekSymulacji);
		
		zarzadcaWyceny.wycenaMonteCarlo(opcjaCall,zarzadcaProjekcji.getMagazynWynikow(),100);

		WynikWyceny cenaMonteCarlo = opcjaCall.getWynikWyceny();

		
	}

	
}
